Finish the sub-second support for unicsv...
authorrobertlipe <robertlipe@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 11 Oct 2014 21:40:49 +0000 (21:40 +0000)
committerrobertlipe <robertlipe@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 11 Oct 2014 21:40:49 +0000 (21:40 +0000)
gpsbabel/reference/unicsv_subsec.csv [new file with mode: 0644]
gpsbabel/testo.d/unicsv.test
gpsbabel/unicsv.cc

diff --git a/gpsbabel/reference/unicsv_subsec.csv b/gpsbabel/reference/unicsv_subsec.csv
new file mode 100644 (file)
index 0000000..995461e
--- /dev/null
@@ -0,0 +1,12 @@
+No,Latitude,Longitude,Name,Date,Time
+1,33.784801,-117.474350,"WPT001",2014/09/17,13:20:20.400
+2,33.784801,-117.474342,"WPT002",2014/09/17,13:20:20.600
+3,33.784801,-117.474342,"WPT003",2014/09/17,13:20:20.800
+4,33.784801,-117.474342,"WPT004",2014/09/17,13:20:21
+5,33.784801,-117.474342,"WPT005",2014/09/17,13:20:21.200
+6,33.784801,-117.474335,"WPT006",2014/09/17,13:20:21.400
+7,33.784801,-117.474335,"WPT007",2014/09/17,13:20:21.600
+8,33.784801,-117.474335,"WPT008",2014/09/17,13:20:21.800
+9,33.784805,-117.474327,"WPT009",2014/09/17,13:20:22
+10,33.784805,-117.474327,"WPT010",2014/09/17,13:20:22.200
+11,33.784805,-117.474327,"WPT011",2014/09/17,13:20:22.400
index fe131328c11a7a66309fd3faf858d20d9618af9c..5115002c4880fac279d4658401d3976be4d6137c 100644 (file)
@@ -22,3 +22,7 @@ compare ${TMPDIR}/headerdetection~unicsv.gpx ${REFERENCE}/extensiondata~unicsv.g
 # check default encoding, i.e. utf-8 in and out.
 gpsbabel -i gpx -f ${REFERENCE}/unicsv_encoding.gpx -o unicsv -F ${TMPDIR}/unicsv_encoding.csv
 compare ${TMPDIR}/unicsv_encoding.csv ${REFERENCE}/unicsv_encoding.csv
+
+# verify fractional second read and writes.
+gpsbabel -i unicsv -f ${REFERENCE}/unicsv_subsec.csv -o unicsv -F ${TMPDIR}/unicsv_subsec.csv
+compare ${TMPDIR}/unicsv_subsec.csv ${REFERENCE}/unicsv_subsec.csv
index f805f8dcee3b6f48c9928165c3736cb5c2a840b3..d729287503d0941d8b4380edb9e0b8374afb4f31 100644 (file)
@@ -380,11 +380,11 @@ unicsv_parse_date(const char* str, int* consumed)
 }
 
 static time_t
-unicsv_parse_time(const char* str, int* msec, time_t* date)
+unicsv_parse_time(const char* str, int* usec, time_t* date)
 {
   int hour, min, ct, sec;
   int consumed = 0;
-  double ms;
+  double us;
   char sep[2];
   time_t ldate;
 
@@ -398,16 +398,16 @@ unicsv_parse_time(const char* str, int* msec, time_t* date)
       *date = ldate;
     }
   }
-  ct = sscanf(str, "%d%1[.://]%d%1[.://]%d%lf", &hour, sep, &min, sep, &sec, &ms);
+  ct = sscanf(str, "%d%1[.://]%d%1[.://]%d%lf", &hour, sep, &min, sep, &sec, &us);
   is_fatal(ct < 5, MYNAME ": Could not parse time string (%s).\n", str);
   if (ct == 6) {
-    *msec = lround((ms * 1000000));
-    if (*msec > 999999) {
-      *msec = 0;
+    *usec = lround((us * 1000000));
+    if (*usec > 999999) {
+      *usec = 0;
       sec++;
     }
   } else {
-    *msec = 0;
+    *usec = 0;
   }
 
   return ((hour * SECONDS_PER_HOUR) + (min * 60) + (int)sec);
@@ -504,7 +504,6 @@ unicsv_compare_fields(const QString& s, const field_t* f)
   return unicsv_compare_fields(CSTR(s), f);
 }
 
-
 static void
 unicsv_fondle_header(QString s)
 {
@@ -639,7 +638,7 @@ unicsv_parse_one_line(char* ibuf)
   int checked = 0;
   time_t date = -1; 
   time_t time = -1;
-  int msec = -1;
+  int usec = -1;
   char is_localtime = 0;
   garmin_fs_t* gmsd;
   double d;
@@ -837,7 +836,7 @@ unicsv_parse_one_line(char* ibuf)
 
     case fld_utc_time:
       if ((is_localtime < 2) && (time < 0)) {
-        time = unicsv_parse_time(CSTR(s), &msec, &date);
+        time = unicsv_parse_time(s, &usec, &date);
         is_localtime = 0;
       }
       break;
@@ -916,7 +915,7 @@ unicsv_parse_one_line(char* ibuf)
 
     case fld_time:
       if ((is_localtime < 2) && (time < 0)) {
-        time = unicsv_parse_time(CSTR(s), &msec, &date);
+        time = unicsv_parse_time(s, &usec, &date);
         is_localtime = 1;
       }
       break;
@@ -954,7 +953,7 @@ unicsv_parse_one_line(char* ibuf)
 
     case fld_datetime:
       if ((is_localtime < 2) && (date < 0) && (time < 0)) {
-        time = unicsv_parse_time(CSTR(s), &msec, &date);
+        time = unicsv_parse_time(s, &usec, &date);
         is_localtime = 1;
       }
       break;
@@ -1062,8 +1061,8 @@ unicsv_parse_one_line(char* ibuf)
         break;
       case fld_gc_exported: {
         time_t time, date;
-        int msec;
-        time = unicsv_parse_time(s, &msec, &date);
+        int usec;
+        time = unicsv_parse_time(s, &usec, &date);
         if (date || time) {
           gc_data->exported = unicsv_adjust_time(time, &date);
         }
@@ -1071,8 +1070,8 @@ unicsv_parse_one_line(char* ibuf)
       break;
       case fld_gc_last_found: {
         time_t time, date;
-        int msec;
-        time = unicsv_parse_time(s, &msec, &date);
+        int usec;
+        time = unicsv_parse_time(s, &usec, &date);
         if (date || time) {
           gc_data->last_found = unicsv_adjust_time(time, &date);
         }
@@ -1153,8 +1152,8 @@ unicsv_parse_one_line(char* ibuf)
       }
     }
 
-    if (msec >= 0) {
-      wpt->creation_time = wpt->creation_time.addMSecs(msec);
+    if (usec >= 0) {
+      wpt->creation_time = wpt->creation_time.addMSecs(MICRO_TO_MILLI(usec));
     }
 
     if (opt_utc) {